import { ref } from "vue";
import { organizationTypeApi } from "@/api/authority";
import { IObject } from "@/types/interface";

/**
 * 组织分类管理业务逻辑说明：
 * 
 * 组织类型定义：
 * - Zendure：作为系统权限最高级别的组织，拥有系统全部权限
 * - 安装商：主要承接新设备的接线安装、设备调试类工作，部分安装商公司在系统运行过程中负责运维排障
 * - 经销商：买卖分销设备，多系统集中管理；部分经销商负责客户报修响应，部分经销商公司兼具承接安装商职能
 * - 组织类客户（B端客户）：拥有系统设备的终端客户，学校/政府/公司/机构等类型
 * 
 * 组织类型特点：
 * - 组织类型固定以上四种，不支持增加、删除，可以修改组织类型的功能权限
 * - 由于服务体系和客户体系的组织使用平台的目的不同，因此可用的功能权限有所区分
 * 
 * 初始权限定义：
 * - Zendure：App、Web全部权限
 * - 安装商：App、Web
 * - 经销商：App、Web
 * - 组织类客户：Web
 * 
 * 权限同步机制：
 * - 当组织类型的权限减少时，关联的角色权限同步减少，角色关联账号强制退出登录，再次登录使用新配置权限
 * - 权限增加时，需手动为角色增加权限
 */

/** 固定组织类型定义 */
export const ORGANIZATION_TYPES = {
  ZENDURE: {
    id: 0,
    name: 'Zendure',
    description: '作为系统权限最高级别的组织，拥有系统全部权限',
    initialPermissions: {
      authorityType: ['App', 'Web'],
      webPermissions: 'all' // 全部权限
    }
  },
  INSTALLER: {
    id: 1,
    name: '安装商',
    description: '主要承接新设备的接线安装、设备调试类工作，部分安装商公司在系统运行过程中负责运维排障',
    initialPermissions: {
      authorityType: ['App', 'Web'],
      webPermissions: 'limited' // 有限权限
    }
  },
  DISTRIBUTOR: {
    id: 2,
    name: '经销商',
    description: '买卖分销设备，多系统集中管理；部分经销商负责客户报修响应，部分经销商公司兼具承接安装商职能',
    initialPermissions: {
      authorityType: ['App', 'Web'],
      webPermissions: 'limited' // 有限权限
    }
  },
  ORGANIZATION_CLIENT: {
    id: 3,
    name: '组织类客户',
    description: '拥有系统设备的终端客户，学校/政府/公司/机构等类型',
    initialPermissions: {
      authorityType: ['Web'],
      webPermissions: 'client' // 客户权限
    }
  }
};

/** 获取组织类型名称 */
export const getOrganizationTypeName = (typeId: number): string => {
  const type = Object.values(ORGANIZATION_TYPES).find(t => t.id === typeId);
  return type ? type.name : '未知类型';
};

/** 获取组织类型描述 */
export const getOrganizationTypeDescription = (typeId: number): string => {
  const type = Object.values(ORGANIZATION_TYPES).find(t => t.id === typeId);
  return type ? type.description : '';
};

/** 组织分类数据接口（与后端返回对齐） */
interface OrganizationTypeData {
  id: string;                    // 根据API文档，id是string类型
  organizationName: string;      // 组织名称
  countryRegion: number;         // 国家/地区，根据API文档是integer
  organizationEmail: string;     // 组织邮箱
  organizationType: number;      // 组织类型，根据API文档是integer
  adminName: string;             // 管理员姓名
  createTime: string;            // 创建时间
  modifyTime: string;            // 修改时间
  modifyUser: string;            // 修改用户
}

/** 查询参数 */
interface QueryParams {
  page?: number;
  pageSize?: number;
  organizationName?: string;
}

/** 权限修改参数接口 */
interface PermissionUpdateData {
  id: string;                    // 根据API文档，id是string类型
  authorityType: string;         // "0":Web,"1":"App","0,1":Web和App
  menuIdList: string[];          // 菜单ID列表
}

/** 权限查询返回数据接口 */
interface PermissionData {
  authorityType: string;         // 权限类型
  menuIdList: string[];          // 菜单ID列表
}

// 模拟组织分类数据 - 注释掉，使用真实API
/*
const mockOrganizationTypes: OrganizationTypeData[] = [
  {
    id: "1",
    type: "Zendure",
    authorityType: "App",
    permissions: ["System Status", "System Overview"],
    updateTime: "2024-02-12 11:12:12",
    updateUser: "xinyao wang@zendure.co"
  },
  // ... 其他模拟数据
];
*/

/** 获取组织分类列表（根组织类型） */
export const getOrganizationTypeList = async (params: QueryParams) => {
  try {
    // 使用根组织类型查询接口
    const response = await organizationTypeApi.getRootTypes();
    if (response.code === 0) {
      return {
        list: response.data.list || [],
        totalCount: response.data.total || 0
      };
    } else {
      console.error('获取组织分类列表失败:', response.msg);
      return { list: [], totalCount: 0 };
    }
  } catch (error) {
    console.error('获取组织分类列表错误:', error);
    return { list: [], totalCount: 0 };
  }
};

/** 添加组织分类（占位：暂未实现） */
export const addOrganizationType = async (typeData: Partial<OrganizationTypeData>) => {
  try {
    // 注意：根据API文档，组织类型主要是查询和修改权限，没有创建接口
    // 这里可能需要使用其他API或者暂时返回错误
    return { success: false, message: '组织类型创建功能暂未实现，请联系后端开发人员' };
  } catch (error) {
    console.error('添加组织分类错误:', error);
    return { success: false, message: '添加失败' };
  }
};

/** 更新组织分类（占位：暂未实现） */
export const updateOrganizationType = async (typeData: Partial<OrganizationTypeData>) => {
  try {
    // 注意：根据API文档，这个接口主要用于修改权限，而不是基本信息
    // 如果需要修改基本信息，可能需要其他API
    return { success: false, message: '组织类型基本信息修改功能暂未实现，请联系后端开发人员' };
  } catch (error) {
    console.error('更新组织分类错误:', error);
    return { success: false, message: '更新失败' };
  }
};

/** 获取组织分类权限详情 */
export const getOrganizationTypeDetail = async (id: string | number) => {
  try {
    // 使用组织类型权限查询接口获取权限详情
    const response = await organizationTypeApi.getTypePermissions(String(id));
    if (response.code === 0) {
      return { success: true, data: response.data as PermissionData };
    } else {
      return { success: false, message: response.msg || '获取详情失败' };
    }
  } catch (error) {
    console.error('获取组织分类详情错误:', error);
    return { success: false, message: '获取详情失败' };
  }
};

/** 修改组织类型权限 */
export const updateOrganizationTypePermissions = async (permissionData: PermissionUpdateData) => {
  try {
    // 使用根组织类型修改接口
    const response = await organizationTypeApi.updateRootType(permissionData);
    if (response.code === 0) {
      return { success: true, data: response.data, message: '组织类型权限修改成功' };
    } else {
      return { success: false, message: response.msg || '组织类型权限修改失败' };
    }
  } catch (error) {
    console.error('修改组织类型权限错误:', error);
    return { success: false, message: '修改权限失败' };
  }
};

/** 获取组织类型权限详情（直通 API） */
export const getOrganizationTypePermissions = async (id: string | number) => {
  try {
    // 使用组织类型权限查询接口
    const response = await organizationTypeApi.getTypePermissions(String(id));
    if (response.code === 0) {
      return { success: true, data: response.data as PermissionData };
    } else {
      return { success: false, message: response.msg || '获取权限失败' };
    }
  } catch (error) {
    console.error('获取组织类型权限错误:', error);
    return { success: false, message: '获取权限失败' };
  }
};

/** 工具：格式化日期 */
export const formatDate = (dateString: string) => {
  const date = new Date(dateString);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  const hours = String(date.getHours()).padStart(2, '0');
  const minutes = String(date.getMinutes()).padStart(2, '0');
  const seconds = String(date.getSeconds()).padStart(2, '0');
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
};
